/*头文件声明区*/
#include <STC15F2K60S2.H>
#include <Seg.h>//数码管专属头文件
#include <Led.h>//Led专属头文件
#include <init.h>//初始化函数专属头文件
#include <Key.h>//按键读取专属头文件
#include <onewire.h>//温度读取专属头文件
#include <intrins.h>
/*变量声明区*/
unsigned char Key_Slow_Down;//按键减速变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键读取变量
unsigned char Seg_Slow_Down;//数码管减速变量
unsigned char Seg_Pos;
unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};
unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0};
unsigned char ucLed[8]={0,0,0,0,0,0,0,0};
float temperature;
unsigned char Seg_Disp_Mode;//数码管显示模式；0——温度显示界面，1——参数设置界面
unsigned char P_Dat[2]={30,20};
unsigned char P_Ctrol[2]={30,20};
bit Seg_Star_Flag;
unsigned int time_500ms;
unsigned int Key_time;
bit Key_flag;
unsigned char P_Dat_Index;


/*按键处理函数*/
void Key_Proc()
{
	if(Key_Slow_Down)return;
	Key_Slow_Down=1;
	
	Key_Val=Key_Read();
	Key_Down=Key_Val&(Key_Val^Key_Old);
	Key_Up=~Key_Val&(Key_Val^Key_Old);
	Key_Old=Key_Val;
	if(Seg_Disp_Mode==1)
	{
		if(Key_Down==14||Key_Down==15)
			Key_flag=1;
	}
	if(Key_time<500)
		
	{
		if(Key_Up==14)
		{
			Key_flag=Key_time=0;
			if(++P_Dat[P_Dat_Index]==71)
				P_Dat[P_Dat_Index]=10;
		}
		if(Key_Up==15)
		{
			Key_flag=Key_time=0;
			if(--P_Dat[P_Dat_Index]==9)
				P_Dat[P_Dat_Index]=70;
		}
	}
	else
	{
		if(Key_Old==14)
		{
			if(++P_Dat[P_Dat_Index]==71)
				P_Dat[P_Dat_Index]=10;
		}
		if(Key_Up==14)
		{
			Key_flag=Key_time=0;
		}
		if(Key_Old==15)
		{
			if(--P_Dat[P_Dat_Index]==9)
				P_Dat[P_Dat_Index]=70;
		}
		if(Key_Up==15)
		{
			Key_flag=Key_time=0;
		}
	}

	switch(Key_Down)
	{
		case 12:
			Seg_Disp_Mode^=1;
			if(Seg_Disp_Mode==0)
			{
				if(P_Dat[0]>P_Dat[1])
				{
					P_Ctrol[0]=P_Dat[0];
					P_Ctrol[1]=P_Dat[1];
				}
			}
			if(Seg_Disp_Mode==1)
			{
				P_Dat[0]=P_Ctrol[0];
				P_Dat[1]=P_Ctrol[1];
			}
				
		break;
		case 13:
			if(Seg_Disp_Mode==1)
				P_Dat_Index^=1;
		break;
		case 16:
			P_Ctrol[0]=30;
			P_Ctrol[1]=20;
		break;
		
	}
		
}

/*信息处理函数*/
void Seg_Proc()
{
	if(Seg_Slow_Down)return;
	Seg_Slow_Down=1;
	/*信息获取区域*/
	temperature=rd_temperature();
	/*数据显示区域*/
	switch(Seg_Disp_Mode)
	{
		case 0:
			Seg_Buf[0]=12;
			Seg_Buf[3]=10;
			Seg_Buf[2]=10;
			Seg_Buf[1]=10;
			Seg_Buf[4]=(unsigned char)temperature/10%10;
			Seg_Buf[5]=(unsigned char)temperature%10;
			Seg_Buf[6]=(unsigned int)(temperature*10)%10;
			Seg_Buf[7]=12;
			Seg_Point[5]=1;
		break;
		case 1:
			Seg_Buf[0]=13;
			Seg_Buf[3]=P_Dat[0]/10%10;
			Seg_Buf[4]=P_Dat[0]%10;
			Seg_Buf[5]=11;
			Seg_Buf[6]=P_Dat[1]/10%10;
			Seg_Buf[7]=P_Dat[1]%10;
			Seg_Point[5]=0;
			
			if(P_Dat_Index==0)
			{
				Seg_Buf[3]=Seg_Star_Flag?P_Dat[0]/10%10:10;
				Seg_Buf[4]=Seg_Star_Flag?P_Dat[0]%10:10;
			}
			if(P_Dat_Index==1)
			{
				Seg_Buf[6]=Seg_Star_Flag?P_Dat[1]/10%10:10;
				Seg_Buf[7]=Seg_Star_Flag?P_Dat[1]%10:10;
			}
		break;
	}
}

/*其他显示函数*/
void Led_Proc()
{
	ucLed[0]=(unsigned char)temperature/P_Ctrol[0];
	ucLed[2]=(unsigned char)(P_Ctrol[1]/temperature);
	if(ucLed[0]==0&&ucLed[2]==0)
		ucLed[1]=1;
	else
		ucLed[1]=0;
}

void Timer1_Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;			//定时器时钟12T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0x18;				//设置定时初始值
	TH1 = 0xFC;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;	//使能定时器1中断
	EA=1;
}


/*定时器0中断服务函数*/
void Timer0Server()interrupt 3
{
	if(++Key_Slow_Down==10)Key_Slow_Down=0;
	if(++Seg_Slow_Down==500)Seg_Slow_Down=0;
	if(++Seg_Pos==8)Seg_Pos=0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
	if(++time_500ms==500)
	{
		time_500ms=0;
		Seg_Star_Flag^=1;
	}
	if(Key_flag)
	{
		if(++Key_time==600)
			Key_time=599;
	}
}

/*延时函数*/
/*void Delay750ms()		//@12.000MHz
{
	unsigned char i, j, k;
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}*/
void Delay750ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}




/*Main*/
void main()
{
	System_init();
	Timer1_Init();
	rd_temperature();
	Delay750ms();
	while(1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}